#ifndef COND_VAR_TEST_H_
#define COND_VAR_TEST_H_

#include <Signal.hh>
#include <CondVar.hh>
#include "Test.hh"

//
/**
 * \file SignalTest.hh
 * \author  jsk <jsk.jinsubkim@gmail.com>
 * \version 1.0
 *
 * \class SignalTest SignalTest.hh
 *
 * CCondVar 클래스를 테스트한다.
 */
class SignalTest : public Test
{
public:
	/**
	 * \name testBasicCase
	 * 
	 * 신호를 대기할 수 있는지 검증하고, 신호가 전달되는지 검증한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf testBasicCase(Signal* Target);
	
	/**
	 * \name testRelease
	 * 
	 * release 메소드를 호출하였을 경우 신호 대기에서 풀려나는지 검증한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf testRelease(Signal* Target);
	
	/**
	 * \name testPreventWaiting
	 * 
	 * 신호 대기를 무시하는 확인한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf testPreventWaiting(Signal* Target);
	
protected:
	/**
	 * \name receiveSignal
	 * 
	 * 시그널을 받으면 Var 변수를 1증가시킨다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	static void* receiveSignal(void* Param);
	
	/**
	 * \name sendSignal
	 * 
	 * 시그널을 생성한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	static void* sendSignal(void* Param);
	
protected:
	/**
	 * ...?
	 */
	static Number Var;
	
	/**
	 * Lock
	 */
	static Mutex Key;
};

#endif //COND_VAR_TEST_H_